﻿using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using PlanningGIS.ArcGIS;

namespace PlanningGIS.MapSheet
{
    /// <summary>
    /// 图幅出图框架对象。高X宽
    /// A1  : 594mm×840mm ；
    /// A2  : 420×594mm ；
    /// A3  : 297×420mm ；
    /// A4  : 210×297mm ；
    /// A5  : 148×210mm ；
    /// A6  : 105*148mm ；
    /// B1  : 706×1000mm ；
    /// B2  : 500×706mm ；
    /// B3  : 353×500mm ；
    /// B4  : 250×353mm   ； 
    /// B5  : 176×250mm ；
    /// 1:500图廓比例尺的默认页面大小为A1大小，地图位置居中
    /// </summary>
    public abstract class SheetFrame :  IFrameInfo
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="sheet">图幅对象</param>
        /// <param name="scale">比例尺</param>
        public SheetFrame(Mapsheet sheet,int scale)
        {
            Sheet = sheet;
            Scale = scale;
            XOffset = 0;
            YOffset = 0;
            Scale = 500;
            UnitValue = 1;
            SecurityLevel = "秘密";
        }

        /// <summary>
        /// 获取或设置需要图幅实例对象【必需】
        /// </summary>
        [Description("获取或设置图幅实例对象【必需】")]
        public Mapsheet Sheet { get; protected set; }

        /// <summary>
        /// 获取或设置输出的比例尺大小【必需】
        /// </summary>
        [Description("获取或设置输出的比例尺大小【必需】")]
        public int Scale { get; protected set; }

        #region IFrameInfo
        /// <summary>
        /// 获取或设置X的偏移量【输入，非必需】
        /// </summary>
        [Description("获取或设置X的偏移量【输入，可选】")]
        public double XOffset { get; set; }

        /// <summary>
        /// 获取或设置Y的偏移量【输入，非必需】
        /// </summary>
        [Description("获取或设置Y的偏移量【输入，可选】")]
        public double YOffset { get; set; }

        /// <summary>
        /// 获取或设置单位，默认为1000（千米）【输入，可选】
        /// </summary>
        [Description("获取或设置单位，默认为1000（千米）,不能为0【输入，可选】")]
        public int UnitValue { get; set; }
        
        /// <summary>
        /// 获取或设置图幅名称【输入，可选】
        /// </summary>
        [Description("获取或设置图幅名称【输入，可选】")]
        public string SheetName { get; set; }

        /// <summary>
        /// 获取或设置密级
        /// </summary>
        public string SecurityLevel { get; set; }

        /// <summary>
        ///  获取或设置单位
        /// </summary>
        public string UnitName { get; set; }

        /// <summary>
        /// 获取或设置关联的九宫格的图号（或图名），从左到右、从上到下【输入，可选】
        /// </summary>
        [Description("获取或设置关联的九宫格的图号（或图名），从左到右、从上到下【输入，可选】")]
        public List<string> SheetCodes { get; set; }

        /// <summary>
        /// 左下角数据信息
        /// </summary>
        public List<string> BottomLeftValues { get; set; }

        /// <summary>
        /// 右下角数据信息
        /// </summary>
        public List<string> BottomRightValues { get; set; }
        #endregion
        
        /// <summary>
        /// 获取图幅经过偏移后的坐标值信息，属性为 XMin、XMax、YMin、YMax。用来处理四个角的坐标对象
        /// </summary>
        public dynamic OffsetExtent { get; protected set; }

        /// <summary>
        /// 布局内边框范围
        /// </summary>
        public IEnvelope InnerExtent { get; protected set; }

        /// <summary>
        /// 布局外边框范围
        /// </summary>
        public IEnvelope OuterExtent { get; protected set; }

        /// <summary>
        /// 毫米换算到点 2.83465
        /// </summary>
        public const double _TOPT_MM = 2.83465;

        /// <summary>
        /// 英寸换算到点 72
        /// </summary>
        public const double _TOPT_IN = 72;

        /// <summary>
        /// 内外边框的距离 1.2 = 1.1+0.1 间隔+宽度
        /// </summary>
        public const double _INNER_DIS = 1.2;

    }
}
